# -*- coding: utf-8 -*- 
# @Time    : 2021/3/23
# @Author  : WangHong 
# @FileName: data_description.py
# @Software: PyCharm
# 用于数据的描述性分析

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import re

plt.style.use('seaborn')
sns.set(font_scale=2)

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


# 加载数据

def load_data(train_path, test_path):
    """
    加载数据
    :param train_path:
    :param test_path:
    :return:
    """
    TRAIN_PATH = './data/train_ dataset/'
    TEST_PATH = './data/test_dataset/'
    df_train = pd.read_csv(train_path + 'nCoV_100k_train.labled.csv', engine='python')
    df_test = pd.read_csv(test_path + 'nCov_10k_test.csv', engine='python')
    return df_train, df_test


###################

def clean_abnormal_label(df_data):
    """
    去除异常标签数据
    :param df_train:
    :return:
    """
    df_data = df_data[df_data['情感倾向'].isin(['-1', '0', '1'])]

    df_data['情感倾向'] = df_data['情感倾向'].astype(np.int32)

    df_data.info(memory_usage='deep')

    df_data.head()
    return df_data


# 可视化标签分布
def show_label_distribution(df_data):
    """
    可视化标签分布
    :param df_data:
    :return:
    """
    df_data['情感倾向'].value_counts() / df_data['情感倾向'].count()
    (df_data['情感倾向'].value_counts() / df_data['情感倾向'].count()).plot.bar()
    plt.show()


def show_webo_num_distribution(df_data):
    """
    可视化微博数量分布
    :param df_data:
    :return:
    """
    df_data['time'] = pd.to_datetime('2020年' + df_data['微博发布时间'], format='%Y年%m月%d日 %H:%M', errors='ignore')

    df_data['date'] = df_data['time'].dt.date

    date_influence = df_data.groupby(['date', '情感倾向'], as_index=False).count()

    sns.relplot(x="date", y="微博id", kind="line", hue='情感倾向', palette=["b", "r", 'g'], data=date_influence)
    plt.xticks(rotation=90, fontsize=12)
    plt.xlabel('日期', fontsize=15)
    plt.ylabel('数量', fontsize=15)
    plt.title('微博数量分布图', fontsize=15)
    plt.show()


def show_webo_emotional_distribution(df_data):
    """
    可视化微博情感分布
    :param df_data:
    :return:
    """
    df_data['time'] = pd.to_datetime('2020年' + df_data['微博发布时间'], format='%Y年%m月%d日 %H:%M', errors='ignore')
    df_data['date'] = df_data['time'].dt.date
    date_influence = df_data.groupby(['date', '情感倾向'], as_index=False).count()
    date_influence = date_influence.merge(
        df_data.groupby('date', as_index=False)['情感倾向'].count().rename(columns={'情感倾向': 'weibo_count'}), how='left',
        on='date')
    date_influence['weibo_rate'] = date_influence['微博id'] / date_influence['weibo_count']
    sns.relplot(x="date", y="weibo_rate", kind="line", hue='情感倾向', palette=["b", "r", 'g'], data=date_influence)
    plt.xticks(rotation=90, fontsize=12)
    plt.xlabel('日期', fontsize=15)
    plt.ylabel('数量', fontsize=15)
    plt.title('微博情感占比分布图', fontsize=15)
    plt.show()


def show_webo_textlen_distribution(df_data):
    """
    可视化，微博中文内容长度统计
    :param df_data:
    :return:
    """
    df_data['char_length'] = df_data['微博中文内容'].astype(str).apply(len)  # 计算每条微博评论的长度
    sns.distplot(df_data['char_length'], kde=False)
    plt.xlabel('长度', fontsize=15)
    plt.ylabel('数量', fontsize=15)
    plt.title('评论长度分布', fontsize=15)
    plt.show()


def label(data):
    if data < 125:
        return '小于125'
    elif data < 150 and data > 125:
        return '125-150'
    else:
        return '大于150'


def show_emotional_textlen(df_data):
    """
    可视化，不同情绪的，文字长度分布
    :param df_data:
    :return:
    """
    df_data['char_length'] = df_data['微博中文内容'].astype(str).apply(len)
    df_data['length_label'] = df_data['char_length'].apply(label)
    sns.countplot('情感倾向', hue='length_label', data=df_data)
    plt.xlabel('长度', fontsize=15)
    plt.ylabel('数量', fontsize=15)
    plt.title('评论长度分布', fontsize=15)
    plt.legend(loc='upper right')
    plt.show()


# 可视化，不同情绪的，文字长度分布


def show_word_cloud(df_data):
    """
    显示词云
    :param df_data:
    :return:
    """
    import wordcloud
    import re
    import jieba
    data_text = ''
    for index, text in df_data['微博中文内容'].items():
        if isinstance(text, str):
            data_text += text
    WC = wordcloud.WordCloud(font_path='C://Windows//Fonts/simfang.ttf', max_words=2000, height=400, width=400,
                             background_color='white', repeat=False, mode='RGBA')  # 设置词云图对象属性
    st1 = re.sub('[，。、“”‘ ’]', '', str(data_text))  # 使用正则表达式将符号替换掉。
    conten = ' '.join(jieba.lcut(st1))  # 此处分词之间要有空格隔开，联想到英文书写方式，每个单词之间都有一个空格。
    con = WC.generate(conten)
    plt.imshow(con)
    plt.axis("off")
    WC.to_file('wordcloud.png')


def show_img_len(df_data):
    """
    微博图片长度分析
    :param df_data:
    :return:
    """
    df_data['pic_len'] = df_data['微博图片'].apply(lambda x: len(eval(x)))
    df_data['pic_len'].value_counts()
    df_data['pic_len'].value_counts().plot.bar()
    plt.title('pic_len(target)')
    sns.countplot(x='pic_len', hue='情感倾向', data=df_data)
    plt.show()


def show_video_len(df_data):
    """
    微博视频长度分析
    :param df_data:
    :return:
    """
    df_data['video_len'] = df_data['微博视频'].apply(lambda x: len(eval(x)))
    df_data['video_len'].value_counts()
    df_data['video_len'].value_counts().plot.bar()
    plt.title('video_len(target)')
    plt.show()


def data_clean(text):
    text = re.sub(r"(回复)?(//)?\s*@\S*?\s*:", "@", text)  # 去除正文中的@和回复/转发中的用户名
    URL_REGEX = re.compile(
        r'^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?(/[^/][a-zA-Z0-9\.\,\?\'\\/\+&%\$#\=~_\-@]*)*$'
        , re.IGNORECASE)
    text = re.sub(URL_REGEX, "", text)  # 去除网址
    text = text.replace("转发微博", "")  # 出去无意义的词
    text = text.replace("O网页链接?", "")
    text = text.replace("O网页链接", "")
    text = text.replace("?展开全文c", "")
    text = text.replace("网页链接", "")
    text = text.replace("展开全文", "")
    text = re.sub(r'\s+', " ", text)  # 合并正文中过多的空格
    return text.strip()


if __name__ == "__main__":
    TRAIN_PATH = './data/train_ dataset/'
    TEST_PATH = './data/test_dataset/'
    df_train, df_test = load_data(TRAIN_PATH, TEST_PATH)
    df_train = clean_abnormal_label(df_train)
    show_label_distribution(df_train)


